#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100000+5;
int n,m,k;
int A[N];
int a[N],c[N];
string rd[N];
int t[4*N];
int b[4*N];
int ans[4*N];
void build(int u,int l,int r,int dep){
    if(l==r){
        t[u]=l;
        ans[u]=l;
        b[u]=(a[l]==-1);
        return;
    }
    int mid=(l+r)/2;
    build(u*2,l,mid,dep+1);
    build(u*2+1,mid+1,r,dep+1);
    int p=t[u*2+(rd[k-dep+1][(1<<k)/(r-l+1)]=='1')];
    if(a[p]>k-dep+1){
        t[u]=t[p];
        b[u]+=b[p];
        ans[u]+=ans[p];
    }else if(b[u]){
        b[u]+=b[p];
        ans[u]+=ans[p]-t[p];
    }
}
void point(int u,int l,int r,int x,int dep){
    if(l>x||r<x) return;
    if(l==r){
        return;
    }
    int mid=(l+r)/2;
    point(u*2,l,mid,dep+1);
    point(u*2+1,mid+1,r,dep+1);
    int p=t[u*2+(rd[k-dep+1][(1<<k)/(r-l+1)]=='1')];
    if(a[p]>k-dep+1){
        t[u]=t[p];
        b[u]+=b[p];
        ans[u]+=ans[p];
    }else if(b[u]){
        b[u]+=b[p];
        ans[u]+=ans[p]-t[p];
    }
}
int query(int u,int l,int r,int x,int dep){
    if(l>x) return;
    if(r<x){
        return ans[u];
    }
    int mid=(l+r)/2;
    int ans=0;
    ans+=query(u*2,l,mid,dep+1);
    ans+=query(u*2+1,mid+1,r,dep+1);
    return ans;
}
int main(){
    freopen("arena.in","r",stdin);
    freopen("arena.out","w",stdout);
    cin>>n>>m;
    memset(a,-1,sizeof(a));
    for(int i=1;i<=n;i++){
        cin>>A[i];
        a[i]=A[i];
    }
    for(int i=1;i<=m;i++){
        cin>>c[i];
    }
    for(int i=1;i<=n;i*=2){
        k++;
    }
    for(int i=1;i<=k;i++){
        cin>>rd[i];
    }
    build(1,1,1<<k,1);
    int t;
    cin>>k;
    while(t--){
        int x[4];
        cin>>x[0]>>x[1]>>x[2]>>x[3];
        for(int i=1;i<=n;i++){
            a[i]=A[i]^(x[i%4]);
            point(1,1,1<<k,i,1);
        }
        int ans;
        for(int i=1;i<=m;i++){
            ans^=i*range(1,1,1<<k,c[i],1);
        }
        cot<<ans<<endl;
    }
    return 0;
}

